#include "../include/head.h"
#include <stdlib.h>
#include <string.h>

// 全局变量记录最大用户ID
int max_user_id;

// 全局用户链表
ListNode *user_list = NULL;

// 用户比较函数（按ID）
int compare_user_by_id(void *a, void *b) {
    User *user_a = (User*)a;
    User *user_b = (User*)b;
    return (user_a->user_id == user_b->user_id) ? 0 : 1;
}

// 用户比较函数（按用户名）
int compare_user_by_name(void *a, void *b) {
    User *user_a = (User*)a;
    char *username_b = (char*)b;
    return strcmp(user_a->username, username_b) == 0 ? 0 : 1;
}

// 保存最大ID到文件
static void save_max_user_id() {
    // 使用相对路径
    FILE *file = fopen("./supermarket_management/data/max_user_id.txt", "w");
    if (file) {
        fprintf(file, "%d", max_user_id);
        fclose(file);
        printf("调试：成功保存到 ./supermarket_management/data/max_user_id.txt\n");
    } else {
        printf("调试：保存失败！错误信息: ");
        perror("fopen"); // 这会显示具体的错误信息
    }
}

// 从文件加载最大ID
static void load_max_user_id() {
    FILE *file = fopen("./supermarket_management/data/max_user_id.txt", "r");
    if (file) {
        fscanf(file, "%d", &max_user_id);
        fclose(file);
        printf("调试：从文件加载max_user_id = %d\n", max_user_id);
    } else {
        max_user_id = 1000;
        printf("调试：文件不存在，使用默认值max_user_id = %d\n", max_user_id);
        printf("调试：错误信息: ");
        perror("fopen");
    }
}

//10 30======================
// 保存用户到文件
static void save_user_to_file(User *user) {
    FILE *file = fopen("./supermarket_management/data/users.txt", "a"); // 追加模式
    if (file) {
        fprintf(file, "%d,%s,%s,%d,%.2f,%.2f,%.2f,%s\n",
                user->user_id,
                user->username,
                user->password, 
                user->user_type,
                user->balance,
                user->points,
                user->coupon_amount,
                user->contact);
        fclose(file);
        printf("用户数据已保存\n");
    } else {
        printf("保存用户数据失败\n");
    }
}
// 保存所有用户到文件
void save_all_users_to_file() {
    FILE *file = fopen("./supermarket_management/data/users.txt", "w");
    if (file) {
        ListNode *current = user_list;
        while (current != NULL) {
            User *user = (User*)current->data;
            fprintf(file, "%d,%s,%s,%d,%.2f,%.2f,%.2f,%s\n",
                    user->user_id,
                    user->username,
                    user->password,
                    user->user_type,
                    user->balance,
                    user->points,
                    user->coupon_amount,
                    user->contact);
            current = current->next;
        }
        fclose(file);
        printf("所有用户数据已保存\n");
    } else {
        printf("保存用户数据失败\n");
    }
}

// // 从文件加载用户（按ID）
// User* find_user_by_id(int user_id) {
//     FILE *file = fopen("./supermarket_management/data/users.txt", "r");
//     if (file) {
//         User *user = (User*)malloc(sizeof(User));
//         while (fscanf(file, "%d,%49[^,],%49[^,],%d,%lf,%lf,%lf,%99[^\n]",
//                     &user->user_id,
//                     user->username,
//                     user->password,
//                     &user->user_type,
//                     &user->balance,
//                     &user->points,
//                     &user->coupon_amount,
//                     user->contact) == 8) {
//             if (user->user_id == user_id) {
//                 fclose(file);
//                 return user;
//             }
//         }
//         fclose(file);
//         free(user);
//     }
//     return NULL; // 用户不存在
// }
//=============1030

// 从链表查找用户（按ID） user_list是开启系统后的全局用户
User* find_user_by_id(int user_id) {
    User temp_user;
    temp_user.user_id = user_id;
    ListNode *found = find_node(user_list, &temp_user, compare_user_by_id);
    return found ? (User*)found->data : NULL;
}


/////
// 从文件加载所有用户到链表
void load_all_users() {
    FILE *file = fopen("./supermarket_management/data/users.txt", "r");
    if (file) {
        User *user;
        while (1) {
            user = (User*)malloc(sizeof(User));
            if (fscanf(file, "%d,%49[^,],%49[^,],%d,%lf,%lf,%lf,%99[^\n]",
                    &user->user_id,
                    user->username,
                    user->password,
                    &user->user_type,
                    &user->balance,
                    &user->points,
                    &user->coupon_amount,
                    user->contact) != 8) {
                free(user);
                break;
            }
            insert_at_end(&user_list, user);
        }
        fclose(file);
        printf("已加载 %d 个用户到内存\n", get_list_length(user_list));
    }
}

// 初始化用户系统
void init_user_system() {
    load_all_users();
    load_max_user_id();
}


// 用户名重复检查函数
int is_username_exists(char *username) {
    // 暂时返回0（不存在），等有文件存储后再实现真实检查
    return 0;
}

// 生成唯一用户ID
int generate_user_id() {
    return ++max_user_id;
}

// 用户注册
User* user_register() {
    // 先加载当前最大ID
    load_max_user_id();
    
    User *new_user = (User*)malloc(sizeof(User));
    if(new_user == NULL) {
        printf("内存分配失败\n");
        return NULL;
    }
    
    printf("\n========== 用户注册 ==========\n");
    
    // 输入用户名并检查重复
    char username[50];
    while (1) {
        printf("请输入用户名: ");
        scanf("%s", username);
        
        // 使用链表检查用户名是否重复
        if (find_node(user_list, username, compare_user_by_name) != NULL) {
            printf("用户名已存在，请重新输入\n");
        } else {
            strcpy(new_user->username, username);
            break;
        }
    }

    // 输入密码
    printf("请输入用户密码: ");
    scanf("%s", new_user->password);

    // 输入联系方式
    printf("请输入联系方式（电话或邮箱）: ");
    scanf("%s", new_user->contact);

    // 设置用户信息
    new_user->user_id = generate_user_id();
    new_user->user_type = 0;
    new_user->balance = 0.0;
    new_user->points = 0.0;
    new_user->coupon_amount = 0.0;

    // 保存新的最大ID到文件
    save_max_user_id();

    // 添加到用户链表
    insert_at_end(&user_list, new_user);
    
    // 保存用户数据到文件
    save_user_to_file(new_user);

    printf("注册成功！您的用户ID是: %d\n", new_user->user_id);
    show_user_info(new_user);
    
    return new_user;
}

// 用户登录
int user_login() {
    int user_id;
    char password[50];
    
    printf("\n========== 用户登录 ==========\n");
    printf("请输入用户ID: ");
    scanf("%d", &user_id);
    printf("请输入密码: ");
    scanf("%s", password);
    
    User* user = find_user_by_id(user_id);
    if(user != NULL){
        if(strcmp(password, user->password) == 0){
            printf("登录成功！欢迎 %s\n", user->username);
            show_user_info(user);
            return user_id;  // 返回用户ID，而不是类型
        } else {
            printf("密码错误！\n");
        }
    } else {
        printf("用户ID不存在！\n");
    }
    return -1;
}

// 显示用户信息
void show_user_info(User *user){
    if(user == NULL) {
        printf("错误：用户信息为空\n");
        return;
    }
    
    printf("\n========== 用户信息 ==========\n");
    printf("用户ID: %d\n", user->user_id);
    printf("用户名: %s\n", user->username);
    
    // 显示用户类型
    char *type_str;
    switch (user->user_type) {
        case -1: type_str = "封号用户"; break;
        case 0: type_str = "普通会员"; break;
        case 1: type_str = "VIP会员"; break;
        case 2: type_str = "SVIP会员"; break;
        case 3: type_str = "管理员"; break;
        default: type_str = "未知类型"; break;
    }
    printf("用户类型: %s\n", type_str);
    
    printf("账户余额: %.2f元\n", user->balance);
    printf("用户积分: %.2f\n", user->points);
    printf("优惠券金额: %.2f元\n", user->coupon_amount);
    printf("联系方式: %s\n", user->contact);
    printf("==============================\n");
}


// 修改密码
int change_password(int user_id, char *new_password) {
    User *user = find_user_by_id(user_id);
    if (user == NULL) {
        printf("用户不存在！\n");
        return -1;
    }
    
    char old_password[50];
    printf("请输入原密码: ");
    scanf("%s", old_password);
    
    if (strcmp(user->password, old_password) != 0) {
        printf("原密码错误！\n");
        return -1;
    }
    
    strcpy(user->password, new_password);
    printf("密码修改成功！\n");
    
    // 保存整个用户链表到文件
    save_all_users_to_file();
    return 0;
}

// 忘记密码（通过联系方式重置）
int reset_password(char *username, char *contact) {
    // 使用链表查找用户
    User *user = find_user_by_name(username);
    if (user == NULL) {
        printf("用户名不存在！\n");
        return -1;
    }
    
    // 验证联系方式
    if (strcmp(user->contact, contact) != 0) {
        printf("联系方式不匹配！\n");
        return -1;
    }
    
    // 设置新密码
    char new_password[50];
    printf("请输入新密码: ");
    scanf("%s", new_password);
    
    strcpy(user->password, new_password);
    
    // 保存更新
    save_all_users_to_file();
    printf("密码重置成功！\n");
    return 0;
}

// 修改用户类型
int change_user_type(int user_id, int new_type) {
    User *user = find_user_by_id(user_id);
    if (user == NULL) {
        printf("用户不存在！\n");
        return -1;
    }
    
    // 检查新类型是否有效
    if (new_type < -1 || new_type > 3) {
        printf("无效的用户类型！\n");
        return -1;
    }
    
    user->user_type = new_type;
    save_all_users_to_file();
    printf("用户类型修改成功！\n");
    return 0;
}

// 余额充值
int recharge_balance(int user_id, double amount) {
    User *user = find_user_by_id(user_id);
    if (user == NULL) {
        printf("用户不存在！\n");
        return -1;
    }
    
    if (amount <= 0) {
        printf("充值金额必须大于0！\n");
        return -1;
    }
    
    user->balance += amount;
    save_all_users_to_file();
    printf("充值成功！充值金额：%.2f元，当前余额：%.2f元\n", amount, user->balance);
    return 0;
}

// 添加优惠券
int add_coupons(int user_id, double amount) {
    User *user = find_user_by_id(user_id);
    if (user == NULL) {
        printf("用户不存在！\n");
        return -1;
    }
    
    if (amount <= 0) {
        printf("优惠券金额必须大于0！\n");
        return -1;
    }
    
    user->coupon_amount += amount;
    save_all_users_to_file();
    printf("优惠券添加成功！添加金额：%.2f元，当前优惠券总额：%.2f元\n", amount, user->coupon_amount);
    return 0;
}

// 删除用户
int delete_user(int user_id) {
    User *user = find_user_by_id(user_id);
    if (user == NULL) {
        printf("用户不存在！\n");
        return -1;
    }
    
    // 不允许删除管理员账户
    if (user->user_type == 3) {
        printf("不允许删除管理员账户！\n");
        return -1;
    }
    
    // 可以选择软删除，将用户类型设置为-1（封号）
    user->user_type = -1;
    save_all_users_to_file();
    printf("用户已删除（封号处理）！\n");
    return 0;
}

// 按用户名查找用户
User* find_user_by_name(char *username) {
    ListNode *found = find_node(user_list, username, compare_user_by_name);
    return found ? (User*)found->data : NULL;
}